﻿#ifndef  XC_SQLITE3_CLASS_H
#define  XC_SQLITE3_CLASS_H

//@模块名称  sqlite3-类
//@版本  1.0  
//@日期  2021-03-08
//@作者  XCGUI  
//@模块备注 官方文档:https://www.sqlite.org/docs.html
//@依赖  module_sqlite3.h


#ifdef XC_MOUDLE
#include "module_sqlite3.h"
#endif

//@src "module_sqlite3_class.cpp"


//@别名 Sqlite3错误
class CXSqlite3Err
{
public:
	CXSqlite3Err();
	~CXSqlite3Err();
	const char*    m_errA;
	const wchar_t* m_err;

	void  close();
};

//@别名  Sqlite3数据库
class CXSqlite3
{
public:
	CXSqlite3();
	~CXSqlite3();
	sqlite3* m_db;

	//@别名 打开A(文件名)
	int openA(const char *filename);

	//@别名 打开(文件名)
	int open(const wchar_t *filename);

	//@别名 关闭()
	int close();

	//@别名 执行SQL(sql字符串, 回调函数, 自定义数据, 接收错误信息)
	int exec(const char *sql, int(*callback)(void*, int, char**, char**), void *userData, CXSqlite3Err& err);

	//@备注 不需要释放返回值
	//@别名 取错误信息A()
	const char* errMsgA();

	//@备注 不需要释放返回值
	//@别名 取错误信息()
	const wchar_t* errMsg();
};

//@别名  Sqlite3语句
class CXStmt
{
public:
	CXStmt();
	~CXStmt();
	sqlite3_stmt* m_stmt;

	//@别名 准备A(数据库连接句柄, sq语句, 长度, 返回下一条语句)
	int prepareA(CXSqlite3 &db, const char *zSql, int nByte, const char **pzTail);
	
	//@别名 准备(数据库连接句柄, sq语句, 长度, 返回下一条语句)
	int prepare(CXSqlite3 &db, const wchar_t *zSql, int nByte, const wchar_t **pzTail);
	
	//@别名 单步()
	int step();

	//@别名 重置()
	int reset();

	//@别名 释放()
	int close();

	//-*-
	//@别名 取列整型(索引_1开始)
	int column_int(int nCol);
	
	//@别名 取列整型64(索引_1开始)
	__int64 column_int64(int nCol);
	
	//@别名 取列文本A(索引_1开始)
	const char *column_textA(int nCol);
	
	//@别名 取列文本(索引_1开始)
	const wchar_t *column_text(int nCol);
	
	//@别名 取列字节(索引_1开始)
	int column_bytes(int nCol);
	
	//@别名 取列双字节(索引_1开始)
	int column_bytes16(int nCol);
	
	//@别名 取列类型(索引_1开始)
	int column_type(int nCol);
	
	//@别名 取列名A(索引_1开始)
	const char *column_nameA(int nCol);
	
	//@别名 取列名(索引_1开始)
	const wchar_t *column_name(int nCol);

	//-*-
	//@别名 绑定双精度浮点型(索引_1开始, 值)
	int bind_double(int nCol, double fValue);

	//@别名 绑定整型(索引_1开始, 值)
	int bind_int(int nCol, int nValue);

	//@别名 绑定整型64(索引_1开始, 值)
	int bind_int64(int nCol, __int64 nValue);

	//@别名 绑定空(索引_1开始)
	int bind_null(int nCol);

	//@别名 绑定文本A(索引_1开始, 字符串, 字符串长度, 回调函数)
	int bind_textA(int nCol, const char* text, int textLength, void(*f)(void*));

	//@别名 绑定文本(索引_1开始, 字符串, 字符串长度, 回调函数)
	int bind_text(int nCol, const wchar_t* text, int textLength, void(*)(void*));

	//@别名 绑定文本64(索引_1开始, 字符串, 字符串长度, 回调函数)
	int bind_text64(int nCol, const char* text, unsigned __int64 textLength, void(*f)(void*), unsigned char encoding);
};

#endif  //XC_SQLITE3_CLASS_H